import { ElMessage } from 'element-plus'
import router from '../router'
import axios from "axios";

const request = axios.create({
    baseURL: import.meta.env.VITE_BASE_URL,
    timeout: 30000,  // 后台接口超时时间设置
    withCredentials: true  // 允许携带凭证信息（cookies、session等）
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
request.interceptors.request.use(config => {
    // 如果是FormData，不设置Content-Type，让浏览器自动设置
    if (!(config.data instanceof FormData)) {
        config.headers['Content-Type'] = 'application/json;charset=utf-8';
    }
    return config
}, error => {
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            try {
            res = res ? JSON.parse(res) : res
          } catch (error) {
            console.error('JSON解析失败:', error);
            ElMessage.error('数据解析失败，请联系管理员');
            return Promise.reject(error);
          }
        }
        // 当权限验证不通过的时候给出提示
        if (res.code === '401') {
            ElMessage.error(res.msg);
            router.push("/login")
        }

        // 处理业务错误（如权限错误、数据不存在等）
        if (res.code && res.code !== 200 && res.code !== '200') {
            // 对于权限错误，不在这里显示消息，让具体组件处理 - 暂时禁用权限控制
            // if (res.code === '500' && res.msg && res.msg.includes('权限')) {
            //     return Promise.reject(new Error(res.msg))
            // }
            // 其他错误可以在这里统一处理
            console.info('API业务信息:', {
                code: res.code,
                message: res.msg || res.message,
                timestamp: new Date().toLocaleString(),
                type: 'api_business_error'
            })
            return Promise.reject(new Error(res.msg || res.message || '请求失败'))
        }

        return res;
    },
        error => {
        console.log('err' + error)
        // 网络错误或其他HTTP错误
        if (error.response) {
            const { status, data } = error.response
            if (status === 500 && data && data.msg) {
                return Promise.reject(new Error(data.msg))
            }
        }
        return Promise.reject(error)
    }
)


export default request
